package com.eunion.fileserver.upload;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.eunion.fileserver.upload.impl.FileUploadFtp;
import com.eunion.fileserver.upload.impl.FileUploadLocal;

/**
 * 文件上传的工厂方法，有本地上传的，有FTP上传的，其它如http,socket等的待续吧.
 * 
 * java.net.NoRouteToHostException: No route to host: connect
 * 
 * @since 2017年2月17日
 */
public class FileUploadFactory {

	static Logger LOG = LoggerFactory.getLogger(FileUploadFactory.class);

	/**
	 * 获取IFileUpload实例.
	 */
	private static IFileUpload getFileUpload() {
		IFileUpload upload = null;
		if (FileUploadHelper.getInstance().isFtpUse()) {
			upload = new FileUploadFtp();
		} else {
			upload = new FileUploadLocal();
		}
		return upload;
	}

	/**
	 * 上传文件，返回相对根目录地址.
	 * @param fv 文件上传对象.
	 * @return 返回相对根目录地址,fv中的数据也会改变.
	 */
	public static void uploadFileInputStream(FileVo fv, String path) {
		fv.setPath(path);
		uploadFileInputStream(fv);
	}

	/**
	 * 上传文件，返回相对根目录地址.
	 * @param fv 文件上传对象.
	 * @return 返回相对根目录地址,fv中的数据也会改变.
	 */
	public static void uploadFileInputStream(FileVo fv) {
		getFileUpload().uploadFileInputStream(fv);
	}

	/**
	 * 上传文件，返回相对根目录地址.
	 * @param fv 文件上传对象.
	 * @return 返回相对根目录地址,fv中的数据也会改变.
	 */
	public static String uploadFile(String file, String path) {
		File f = new File(file);
		if (f != null && f.exists()) {
			InputStream inputStream;
			try {
				inputStream = new FileInputStream(f);
			} catch (FileNotFoundException e) {
				LOG.error("待上传文件不存在", e);
				return null;
			}
			FileVo fv = new FileVo();
			fv.setFileInputStream(inputStream);
			fv.setPath(path);
			fv.setSize(f.getTotalSpace());
			fv.setType("." + FileUploadHelper.getExtensionName(file));
			fv.setNameOrg(f.getName());

			IFileUpload upload = null;
			if (FileUploadHelper.getInstance().isFtpUse()) {
				upload = new FileUploadFtp();
			} else {
				upload = new FileUploadLocal();
			}
			upload.uploadFileInputStream(fv);
			if (fv.isUpload()) {
				return fv.getRelativePath();
			}
		}
		return null;
	}

	/**
	 * 上传文件，返回相对根目录地址.
	 * @param fv 文件上传对象.
	 * @return 返回相对根目录地址,fv中的数据也会改变.
	 */
	public static String uploadFile(String file) {
		return uploadFile(file, FileUploadHelper.DEFAULT_UPLOAD_DIR);
	}

	/**
	 * 删除文件.
	 * @param deleteFile 待删除文件.
	 * @return 文件删除的状态，true表示成功,false表示失败.
	 */
	public static boolean deleteFile(String deleteFile) {
		return getFileUpload().deleteFile(deleteFile);
	}

	/**
	 * 下载文件.
	 * @param source 待下载文件,相对根路径，不带前缀/
	 * @param destination localPathName 下载到本地的绝对地址及文件
	 * @return 状态，true表示成功,false表示失败.
	 */
	public static boolean downloadFile(String source, String destination) {
		return getFileUpload().downloadFile(source, destination);
	}

	/**
	 * 下载文件到流.
	 * @param source 待下载文件,相对根路径，不带前缀/
	 * @return InputStream 输出流， null表示失败
	 */
	public static InputStream getFileInputStream(String source) {
		return getFileUpload().getFileInputStream(source);
	}

	/**
	 * @param directory 待查阅目录,相对根路径，不带前缀/
	 * @return 返回目录有的文件列表. null表示失败
	 */
	public static List<String> listFiles(String directory) {
		return getFileUpload().listFiles(directory);
	}

}
